import { onMounted, onUnmounted, ref, watch } from 'vue'
import { useUserStore } from '@/stores/user'

/**
 * 用户活动监听 Composable
 * 监听用户的鼠标、键盘等操作，在用户有操作时自动刷新token以维持登录状态
 */
export function useUserActivity() {
  const userStore = useUserStore()
  
  // 防抖定时器
  let activityTimer: ReturnType<typeof setTimeout> | null = null
  // 最后一次活动时间
  const lastActivityTime = ref<number>(Date.now())
  // 是否正在刷新token
  const isRefreshing = ref(false)
  
  // 活动检测间隔（毫秒）- 用户操作后等待一段时间再检查token
  const ACTIVITY_DEBOUNCE = 1000 // 1秒
  // token刷新阈值（毫秒）- token剩余时间少于这个值时刷新
  const TOKEN_REFRESH_THRESHOLD = 10 * 60 * 1000 // 10分钟
  
  /**
   * 检查并刷新token
   */
  const checkAndRefreshToken = async () => {
    // 如果用户未登录，不执行任何操作
    if (!userStore.isLoggedIn || !userStore.token) {
      return
    }
    
    // 如果正在刷新，跳过
    if (isRefreshing.value) {
      return
    }
    
    try {
      // 检查token是否即将过期
      const tokenValue = userStore.token
      if (!tokenValue) {
        return
      }
      
      // 解析token获取过期时间
      const payload = JSON.parse(atob(tokenValue.split('.')[1]))
      const exp = payload.exp * 1000 // 转换为毫秒
      const now = Date.now()
      const timeUntilExpiry = exp - now
      
      // 如果token剩余时间少于阈值，则刷新
      if (timeUntilExpiry <= TOKEN_REFRESH_THRESHOLD) {
        isRefreshing.value = true
        console.log(`检测到用户活动，token即将过期（剩余${Math.round(timeUntilExpiry / 1000 / 60)}分钟），自动刷新token...`)
        
        // 调用刷新token方法，使用10分钟作为阈值（比默认的5分钟更宽松，在用户有操作时提前刷新）
        await userStore.refreshTokenIfNeeded(10)
        
        console.log('Token自动刷新完成')
      }
    } catch (error) {
      console.error('检查并刷新token时出错:', error)
    } finally {
      isRefreshing.value = false
    }
  }
  
  /**
   * 处理用户活动
   */
  const handleUserActivity = () => {
    // 更新最后活动时间
    lastActivityTime.value = Date.now()
    
    // 清除之前的定时器
    if (activityTimer) {
      clearTimeout(activityTimer)
    }
    
    // 设置新的定时器，在用户停止操作一段时间后检查token
    activityTimer = setTimeout(() => {
      checkAndRefreshToken()
    }, ACTIVITY_DEBOUNCE)
  }
  
  // 页面可见性变化处理函数
  const handleVisibilityChange = () => {
    if (!document.hidden && userStore.isLoggedIn) {
      // 页面变为可见时，立即检查token
      checkAndRefreshToken()
    }
  }
  
  // 窗口焦点处理函数
  const handleWindowFocus = () => {
    if (userStore.isLoggedIn) {
      checkAndRefreshToken()
    }
  }
  
  // 是否已初始化监听器
  let listenersInitialized = false
  
  /**
   * 初始化活动监听
   */
  const initActivityListeners = () => {
    // 避免重复初始化
    if (listenersInitialized) {
      return
    }
    
    // 监听鼠标移动
    document.addEventListener('mousemove', handleUserActivity, { passive: true })
    // 监听鼠标点击
    document.addEventListener('click', handleUserActivity, { passive: true })
    // 监听键盘输入
    document.addEventListener('keydown', handleUserActivity, { passive: true })
    // 监听滚动
    document.addEventListener('scroll', handleUserActivity, { passive: true })
    // 监听触摸事件（移动端）
    document.addEventListener('touchstart', handleUserActivity, { passive: true })
    document.addEventListener('touchmove', handleUserActivity, { passive: true })
    
    // 页面可见性变化时也检查（用户切换回标签页时）
    document.addEventListener('visibilitychange', handleVisibilityChange)
    
    // 窗口获得焦点时检查
    window.addEventListener('focus', handleWindowFocus)
    
    listenersInitialized = true
  }
  
  /**
   * 移除活动监听
   */
  const removeActivityListeners = () => {
    if (!listenersInitialized) {
      return
    }
    
    document.removeEventListener('mousemove', handleUserActivity)
    document.removeEventListener('click', handleUserActivity)
    document.removeEventListener('keydown', handleUserActivity)
    document.removeEventListener('scroll', handleUserActivity)
    document.removeEventListener('touchstart', handleUserActivity)
    document.removeEventListener('touchmove', handleUserActivity)
    document.removeEventListener('visibilitychange', handleVisibilityChange)
    window.removeEventListener('focus', handleWindowFocus)
    
    if (activityTimer) {
      clearTimeout(activityTimer)
      activityTimer = null
    }
    
    listenersInitialized = false
  }
  
  // 组件挂载时初始化
  onMounted(() => {
    // 如果用户已登录，立即初始化监听
    if (userStore.isLoggedIn) {
      initActivityListeners()
      // 初始化时也检查一次token
      checkAndRefreshToken()
    }
    
    // 监听登录状态变化
    const stopWatcher = watch(
      () => userStore.isLoggedIn,
      (isLoggedIn) => {
        if (isLoggedIn) {
          // 用户登录时，启用活动监听
          initActivityListeners()
          // 立即检查一次token
          checkAndRefreshToken()
        } else {
          // 用户登出时，移除活动监听
          removeActivityListeners()
        }
      }
    )
    
    // 组件卸载时清理
    onUnmounted(() => {
      stopWatcher()
      removeActivityListeners()
    })
  })
  
  return {
    lastActivityTime,
    isRefreshing,
    checkAndRefreshToken
  }
}

